EF Core - Fric-frac model op basis van bestaande database
In deze les bouwen we het model van een ASP.NET Core MVC-toepassing met behulp van Entity Framework. We gebruiken reverse engineering om een Entity Framework-model te maken op basis van een bestaande database. Dit heette vroeger Database First.
Stappenplan
- Tabellen zijn reeds gemaakt in de Fric-frac MySQL database: Fric-frac MySQL Data Definition Language.
- EF Core is reeds geïnstalleerd in je project: EF Core - installeren.
- Om het model te genereren gebruiken we de EF Core Package Manager Console Tools. Vermits we niet de MsSql Data Provider gebruiken maar de MySql Data Provider hebben we in EF Core - installeren daarvoor specifieke packages geïnstalleerd.
- EF Tools gebruikt de Solution Name als naam voor de root namespace van de modelklassen. Vermits onze solution Fric-frac heet en er in de namespacenamen geen koppeltekens mogen voorkomen kunnen we twee dingen doen. Doen we dat niet moeten we manueel de namespaces aanpassen en daar heb ik geen zin in:
- We geven de Solution een andere naam (maar dit is niet de beste oplossing, zie hieronder voor een beter alternatief).
- Christophe Dutoit heeft een veel betere oplossing. In het bijhorende filmpje, zegt hij, wordt de naam Fric-frac veranderd in FricFrac (geen koppelteken) omdat er anders een namespace met koppelteken wordt aangemaakt en VS houdt daar niet van.Ik zelf behoud graag dat koppelteken in mijn solution-naam en dit kan als je:
- Rechtsklik op je solution-naam (hier Fric-Frac)
- Vervolgens klikt op properties (helemaal onderaan)
- Dan in de eerste Tab "Application" kan je een naam kiezen voor je solution (Assembly Name) en voor je default-namespace:
- Sluit Visual Studio en start open de solution met de nieuwe naam FricFrac.
- We kunnen nu het model laten genereren. We gaan de modelklassen eerst in een map met de naam Models/FricFrac plaatsen. Vandaar dat we de optie
-OutputDir Models/FricFrac
toevoegen. - We beginnen met de fluent API:
- in de Project Manager typ je:
PM>Scaffold-DbContext "server=164.132.231.13;user id=docent300;password=AqDHX9q2Z;port=3306;database=docent300;SslMode=none" Pomelo.EntityFrameworkCore.MySql -OutputDir Models/FricFrac
- als je de database wijzigt kan je de modelklassen opnieuw genereren en de oude laten overschrijven door de
-Force
optie toe te voegen:PM>Scaffold-DbContext "server=164.132.231.13;user id=docent300;password=AqDHX9q2Z;port=3306;database=docent300;SslMode=none" Pomelo.EntityFrameworkCore.MySql -OutputDir Models/FricFrac -Force
- in de Project Manager typ je:
- We kunnen naast de fluent API ook Data Annotations gebruiken. We leren eerst wat Data Annotations zijn en daarna gaan we data geannoteerde modelklassen genereren.
- Validatie toevoegen aan de model klassen:
- Om data-geannoteerde modelklassen te genereren:
PM>Scaffold-DbContext "server=164.132.231.13;user id=docent300;password=AqDHX9q2Z;port=3306;database=docent300;SslMode=none" Pomelo.EntityFrameworkCore.MySql -OutputDir Models/FricFrac -Force -DataAnnotations
- Op basis van de metadata in de database zijn nu data-annotaties toegevoegd:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace FricFrac.Models.FricFrac { public partial class Country { public Country() { Person = new HashSet<Person>(); } [Required] [StringLength(50)] public string Name { get; set; } [StringLength(2)] public string Code { get; set; } [Column(TypeName = "int(11)")] public int Id { get; set; } [InverseProperty("Country")] public ICollection<Person> Person { get; set; } } }
- We zijn vertrokken van de bestaande Fric-frac database. We kunnen nu in de omgekeerde richting werken en de database laten wijzigen op basis van het model. Om dat te illustreren gaan we de
Country
modelklasse wijzigen:- Om met migratie te kunnen werken moeten we eerst de tabellen in MySQL deleten en ze opnieuw laten aanmaken door Visual Studio. Ik weet dat dit onnozel lijkt. Maar ik zie voorlopig geen andere oplossing.
- In MySql run je de volgende script:
use docent300; DROP TABLE IF EXISTS `User`; DROP TABLE IF EXISTS `Role`; DROP TABLE IF EXISTS `Person`; DROP TABLE IF EXISTS `Country`; DROP TABLE IF EXISTS `Event`; DROP TABLE IF EXISTS `EventCategory`; DROP TABLE IF EXISTS `EventTopic`;
- We creëren opnieuw de tabellen op de basis van het model van Fric-Frac:
Add-Migration InitialCreate
- We updaten de MySql database met:
Update-Database
- In MySql run je de volgende script:
- Voeg de property Code toe aan de Country modelklasse:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace FricFrac.Models.FricFrac { public partial class Country { public Country() { Person = new HashSet<Person>(); } [Required] [StringLength(50)] public string Name { get; set; } [StringLength(2)] public string Code { get; set; } [Column(TypeName = "int(11)")] public int Id { get; set; } [StringLength(256)] public string Desc { get; set; } [InverseProperty("Country")] public ICollection<Person> Person { get; set; } } }
- Voer het volgende commando uit in de Package Manager Console:
PM>Add-Migration AddCountryDesc
- De code voor die migratie wordt toegevoegd aan het project:
- Nadat we de migratie aan het project hebben toegevoegd kunnen we de database updaten:
Update-Database
- En we zien dat de MySql database is geüpdated. Er is een migratie-tabel toegevoegd en de nieuwe
Desc
kolom staat nu in deCountry
tabel:
- Om met migratie te kunnen werken moeten we eerst de tabellen in MySQL deleten en ze opnieuw laten aanmaken door Visual Studio. Ik weet dat dit onnozel lijkt. Maar ik zie voorlopig geen andere oplossing.
Bronnen
- Microsoft, Getting Started with EF Core on ASP.NET Core with an Existing Database, 10/27/2016
- Microsoft, Migrations, 10/30/2017
- Christos Matskas, EF Core migrations with existing database schema and data, 07 December 2016
2018-01-12 13:37:42